package com.cool.collect.springcode.a12;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author xiemiao
 * @description
 * @date 2023/09/04
 */
public class JdkProxyDemo {

    interface Foo {
        void foo();
    }

    static class Target implements Foo {

        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

    // jdk 只能针对接口代理
    // cglib
    public static void main(String[] param) throws IOException {
        Target target = new Target();

        ClassLoader classLoader = JdkProxyDemo.class.getClassLoader();
        Foo proxy = (Foo) Proxy.newProxyInstance(classLoader, new Class[]{Foo.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("before");
                // 目标.方法（参数）
                // 方法.invoke（目标，参数）
                Object result = method.invoke(target, args);
                return result;
            }
        });

        // 使用arthas查看源码需要获取类名
        System.out.println(proxy.getClass());

        proxy.foo();

        // arthas读取运行中的程序代码
        System.in.read();
    }
}
